# r：以只读的方式打开文本文件，文件必须存在；

# w：以只写的方式打开文本文件，文件若存在则清空文件内容从文件头部开始写，若不存在则根据文件名创建新文件并只写打开；

# a：以只写的方式打开文本文件，文件若存在则从文件尾部以追加的方式开始写，文件原来存在的内容不会清除（除了文件尾标志EOF），若不存在则根据文件名创建新文件并只写打开；

# r+：以可读写的方式打开文本文件，文件必须存在；

# w+：以可读写的方式打开文本文件，其他与w一样；

# a+：以可读写的方式打开文本文件，其他与a一样；

require "claide"

module Imp2pod
  class Command < CLAide::Command
    prepend Config::Mixin

    self.version = VERSION
    self.command = "imp2pod"
    self.description = "能把你的Swift的import语句转换成pod依赖的神奇的工具"

    NOUSE_OPTIONS = [
      "",
      " ",
      "UIKit",
      "Foundation",
    ]

    def self.options
      [
        ["--silent", "Show nothing"],
        ["--file-path=pathname", "the file path is the import need to be translateed"],
        ["--mode=[pod|dependency|all]", "要生成什么文件"],
      ].concat(super)
    end

    self.arguments = [
      CLAide::Argument.new("--file-path=<import_file>", true),
    ]

    def self.run(argv)
      super(argv)
    end

    def initialize(argv)
      super
      config.silent = argv.flag?("silent", config.silent)
      @file_path = argv.option("file-path")
      @mode = argv.option("mode")
      @mode = "all" if @mode.nil?
    end

    #真正的处理你想做的事情
    def run
      if @file_path.nil?
        Command.banner!
        return
      end

      currentDir = Pathname.pwd
      full_path = currentDir + @file_path
      data_arr = translate_intpu_to_array(full_path)
      write_what_you_want(data_arr)
    end

    def translate_intpu_to_array(full_path)
      unless File.exist?(full_path)
        UI.error "you must give the '--file-path=pathname' option"
      end

      data = IO.read full_path
      data_arr = data.to_s.chomp.split("import").compact.uniq.map do |item|
        value = "#{item}".strip
        value
      end

      data_arr.delete_if { |item| NOUSE_OPTIONS.include? item }
      data_arr
    end

    def write_what_you_want(data_arr)
      mode_type = @mode.to_sym
      case mode_type
      when :pod
        write_file(data_arr, "pod", "my_pod.txt")
      when :dependency
        write_file(data_arr, "s.dependency", "my_dependency.txt")
      when :all
        write_file(data_arr, "pod", "my_pod.txt")
        write_file(data_arr, "s.dependency", "my_dependency.txt")
      else
        write_file(data_arr, "pod", "my_pod.txt")
        write_file(data_arr, "s.dependency", "my_dependency.txt")
      end
    end

    def write_file(data_arr, prefix_name, file_name)
      currentDir = Pathname.pwd
      pod_file_name = currentDir + file_name
      if File.exist? pod_file_name
        FileUtils.rm_r pod_file_name
      end

      pod_arr = data_arr.map do |item|
        value = "#{prefix_name} \"#{item}\""
        value
      end
      result_str = ""
      pod_arr.each do |pod|
        result_str += "#{pod} \n"
      end

      UI.notice result_str
      File.open(pod_file_name, "w+") do |file|
        file.write(result_str)
      end
    end
  end
end
